home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / ww_tv.exe / TEVENT.CPP < prev    next >
C/C++ Source or Header  |  1992-01-03  |  6KB  |  222 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tevent.cpp                                */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TEvent member functions                   */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision -  Version 1.0                             */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Copyright (c) 1991 by Borland International             */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*------------------------------------------------------------*/
  17.  
  18. // PRIMATECH MODIFICATION HISTORY:
  19. //
  20. //  ??-??-91 JLS    Added code to initialize the shiftstate in the event
  21. //
  22. //  01-02-91 JLS    Synchronized with BC++ 3.0
  23. //  01-02-91 JLS    Removed initialization of TEventQueue::eventQueue because
  24. //                      it caused the compiler to have a GP fault.
  25.  
  26.  
  27. #define Uses_TEventQueue
  28. #define Uses_TEvent
  29. #define Uses_TScreen
  30. #include <tv.h>
  31.  
  32. #if !defined( __DOS_H )
  33. #ifndef __DOS_H
  34. #include <dos.h>
  35. #endif
  36. #endif  // __DOS_H
  37.  
  38. #if !defined( __BIOS_H )
  39. #ifndef __BIOS_H
  40. #include <bios.h>
  41. #endif
  42. #endif  // __BIOS_H
  43.  
  44. //TEvent near TEventQueue::eventQueue[ eventQSize ] = { {0} };
  45. TEvent near TEventQueue::eventQueue[ eventQSize ];// = { {TEvent(0)} };
  46. TEvent *near TEventQueue::eventQHead = TEventQueue::eventQueue;
  47. TEvent *near TEventQueue::eventQTail = TEventQueue::eventQueue;
  48. Boolean near TEventQueue::mouseIntFlag = False;
  49.  
  50. #ifdef PROTECT
  51. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( biosSeg, 0x006c );
  52. #else
  53. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( 0x0040, 0x006c );
  54. #endif
  55.  
  56. ushort near TEventQueue::eventCount = 0;
  57. Boolean near TEventQueue::mouseEvents = False;
  58. Boolean near TEventQueue::mouseReverse = False;
  59. ushort near TEventQueue::doubleDelay = 8;
  60. ushort near TEventQueue::repeatDelay = 8;
  61. ushort near TEventQueue::autoTicks = 0;
  62. ushort near TEventQueue::autoDelay = 0;
  63.  
  64. MouseEventType near TEventQueue::lastMouse;
  65. MouseEventType near TEventQueue::curMouse;
  66. MouseEventType near TEventQueue::downMouse;
  67. ushort near TEventQueue::downTicks = 0;
  68.  
  69. TEventQueue::TEventQueue()
  70. {
  71.     resume();
  72. }
  73.  
  74. void TEventQueue::resume()
  75. {
  76.     if( mouse.present() == False )
  77.         mouse.resume();
  78.     if( mouse.present() == False )
  79.         return;
  80.     mouse.getEvent( curMouse );
  81.     lastMouse = curMouse;
  82.     mouse.registerHandler( 0xFFFF, mouseInt );
  83.     mouseEvents = True;
  84.     mouse.show();
  85.     TMouse::setRange( TScreen::screenWidth-1, TScreen::screenHeight-1 );
  86. }
  87.  
  88. void TEventQueue::suspend()
  89. {
  90.     mouse.suspend();
  91. }
  92.  
  93. TEventQueue::~TEventQueue()
  94. {
  95.     suspend();
  96. }
  97.  
  98. void TEventQueue::getMouseEvent( TEvent& ev )
  99. {
  100.     if( mouseEvents == True )
  101.         {
  102.  
  103.         getMouseState( ev );
  104.  
  105.         if( ev.mouse.buttons == 0 && lastMouse.buttons != 0 )
  106.             {
  107.             ev.what = evMouseUp;
  108.             lastMouse = ev.mouse;
  109.             return;
  110.             }
  111.  
  112.         if( ev.mouse.buttons != 0 && lastMouse.buttons == 0 )
  113.             {
  114.             if( ev.mouse.buttons == downMouse.buttons &&
  115.                 ev.mouse.where == downMouse.where &&
  116.                 ev.what - downTicks <= doubleDelay )
  117.                     ev.mouse.doubleClick = True;
  118.  
  119.             downMouse = ev.mouse;
  120.             autoTicks = downTicks = ev.what;
  121.             autoDelay = repeatDelay;
  122.             ev.what = evMouseDown;
  123.             lastMouse = ev.mouse;
  124.             return;
  125.             }
  126.  
  127.         ev.mouse.buttons = lastMouse.buttons;
  128.  
  129.         if( ev.mouse.where != lastMouse.where )
  130.             {
  131.             ev.what = evMouseMove;
  132.             lastMouse = ev.mouse;
  133.             return;
  134.             }
  135.  
  136.         if( ev.mouse.buttons != 0 && ev.what - autoTicks > autoDelay )
  137.             {
  138.             autoTicks = ev.what;
  139.             autoDelay = 1;
  140.             ev.what = evMouseAuto;
  141.             lastMouse = ev.mouse;
  142.             return;
  143.             }
  144.         }
  145.  
  146.     ev.what = evNothing;
  147. }
  148.  
  149. void TEventQueue::getMouseState( TEvent & ev )
  150. {
  151.     disable();
  152.     if( eventCount == 0 )
  153.         {
  154.         ev.what = *Ticks;
  155.         ev.mouse = curMouse;
  156.         }
  157.     else
  158.         {
  159.         ev = *eventQHead;
  160.         if( ++eventQHead >= eventQueue + eventQSize )
  161.             eventQHead = eventQueue;
  162.         eventCount--;
  163.         }
  164.     enable();
  165.     if( mouseReverse != False && ev.mouse.buttons != 0 && ev.mouse.buttons != 3 )
  166.         ev.mouse.buttons ^= 3;
  167.  
  168.     ev.shiftState = *((uchar*)MK_FP(0x40, 0x17));
  169. }
  170.  
  171. #pragma saveregs
  172.  
  173. void huge TEventQueue::mouseInt()
  174. {
  175.     unsigned flag = _AX;
  176.     MouseEventType tempMouse;
  177.  
  178.     tempMouse.buttons = _BL;
  179.     tempMouse.doubleClick = False;
  180.     tempMouse.where.x = _CX >> 3;
  181.     tempMouse.where.y = _DX >> 3;
  182.  
  183.     if( (flag & 0x1e) != 0 && eventCount < eventQSize )
  184.         {
  185.         eventQTail->what = *Ticks;
  186.         eventQTail->mouse = curMouse;
  187.         if( ++eventQTail >= eventQueue + eventQSize )
  188.             eventQTail = eventQueue;
  189.         eventCount++;
  190.         }
  191.  
  192.     curMouse = tempMouse;
  193.     mouseIntFlag = True;
  194. }
  195.  
  196. #pragma warn -asc
  197.  
  198. void TEvent::getKeyEvent()
  199. {
  200.     asm {
  201.         MOV AH,1;
  202.         INT 16h;
  203.         JNZ keyWaiting;
  204.         };
  205.     what = evNothing;
  206.     return;
  207.  
  208. keyWaiting:
  209.  
  210.     what = evKeyDown;
  211.     shiftState = *((uchar*)MK_FP(0x40, 0x17));
  212.  
  213.     asm {
  214.         MOV AH,0;
  215.         INT 16h;
  216.         };
  217.     keyDown.keyCode = _AX;
  218.     return;
  219. }
  220.  
  221. #pragma warn .asc
  222.